package ca.clarity.hms.util;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;

/**
 * Network checker.
 *
 * @author Junghun, Shin
 * @since 1.0
 */
public class NetworkChecker {

    private static String TAG = NetworkChecker.class.getSimpleName();

    private static NetworkChecker networkChecker;

    public static NetworkChecker getInstance() {
        if (networkChecker == null) {
            networkChecker = new NetworkChecker();
        }
        return networkChecker;
    }

    /**
     * Wifi 상태를 체크한다.
     *
     * @param context {@link android.content.Context} 안드로이드 컨텍스트
     * @return 연결 됐으면 <tt>true</tt>, 그렇지 않으면 <tt>false</tt>
     */
    private boolean isWifiAvailable(Context context) {

        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        assert networkInfo != null;
        return networkInfo.isConnected();
    }

    /**
     * 3G 상태를 체크한다.
     *
     * @param context {@link android.content.Context} 안드로이드 컨텍스트
     * @return 연결 됐으면 <tt>true</tt>, 그렇지 않으면 <tt>false</tt>
     */
    private boolean is3gAvailable(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
        assert networkInfo != null;
        return networkInfo.isConnected();
    }

    /**
     * Network 상태를 체크한다.
     *
     * @param context {@link android.content.Context} 안드로이드 컨텍스트
     * @return 연결 됐으면 <tt>true</tt>, 그렇지 않으면 <tt>false</tt>
     */
    public boolean isNetworkConnected(Context context) {
        if (isWifiAvailable(context)) {
            Log.d(TAG, "Wifi가 활성화 상태입입니다.");
            return true;
        } else if (is3gAvailable(context)) {
            Log.d(TAG, "3G가 활성화 상태입입니다.");
            return true;
        } else {
            Log.d(TAG, "Network가 비활성화 상태입니다.");
            return false;
        }
    }
}
